[Play framework 2.0]リクエストをインターセプト
リクエストをインターセプトする
play2.0ではGolobalSettignsを継承したクラスを使用し、アプリケーション起動時や終了時に処理をいれることができます。 これに加え、リクエスト時に処理を挟み込むことも可能になっています。 今回はリクエスト時に処理をフックする方法をご紹介します。
今回使用した動作環境は以下のとおりです。 HEADを取得してビルドします
- OS : MacOS X 10.7.4
- Playframework : HEAD
- Java : 1.6.0_26
注意: この記事ではgithubから取得したHEAD版を使用して試しています。 正式リリース前の状況のため思わぬ不具合が生じるかもしれませんので、ご了承ください。
ソースのHEADを取得してセットアップ
まだgithubからソースを取得していない人は、play2.0のソースを取得してビルドしましょう。
$ git clone https://github.com/playframework/Play20.git $ cd Play20/framework $ ./build > complile > build-repository > publish-local
すでにソースを取得している人は、最新の状態に更新してビルドします。
$ git pull $ cd Play20/framework $ ./cleanEverything $ ./build > compile > build-repository > publish-local
これで準備ができました。
プロジェクト作成
Scalaベースのプロジェクトを作成し、sbtコンソールを起動します。
% play new intercept % cd intercept % play
ソースをEclipseで編集したいなら、eclipsifyを実行してeclipseプロジェクト化してインポートしてソースの修正をしましょう。
>[intercept] $ eclipsify
サンプルコードを記述
localhost:9000にアクセスしたらリクエストをフックして、内容を表示する簡単なサンプルを作成します。 Globalオブジェクトを追加しましょう。 intercept/appディレクトリ直下にglobal.scalaファイルを作成し、下記のように記述します。
import play.api._ import play.api.mvc._ import play.api.mvc.Results._ object Global extends GlobalSettings { override def onRouteRequest(request: RequestHeader): Option[Handler] = { println("リクエストの確認:") println("executed before every request:" + request.toString) super.onRouteRequest(request) } }
onRouteRequestをオーバーライドすることで、リクエストをフックすることができます。
ではアプリケーションを起動して、localhost:9000にアクセスしてみましょう。 Playコンソールからrunコマンドを実行し、localhost:9000にブラウザでアクセスしてください。 下記のようなログが出力されます。
[info] play - Application started (Dev) リクエストの確認: executed before every request:GET / リクエストの確認: executed before every request:GET /assets/stylesheets/main.css リクエストの確認: executed before every request:GET /assets/javascripts/jquery-1.7.1.min.js
リクエストの回数分だけonRouteRequestが実行されています。 RequestHeaderを受け取るので、クエリストリングにもアクセス可能です。
まとめ
今回はリクエストをフックする方法をご紹介しました。 ここで処理を記述すれば、ログやバリデーションや認証などいろいろ捗りそうです。